//  先实现一个基础的StorageBase类 把getItem和setItem方法放在它的原型链上
function StorageBase() { }
StorageBase.prototype.getItem = function (key) {
    return localStorage.getItem(key)
}
StorageBase.prototype.setItem = function (key, value) {
    return localStorage.setItem(key, value)
}

// 以闭包的形式创建一个引用自由变量的构造函数
const Storage = (function () {
    // 由于闭包的原因 只有在return出去的函数中或这函数中才能改变唯一实例
    let instance = null
    return function () {
        // 判断自由变量是否为null
        // 第二次不会修改唯一实例
        if (!instance) {
            // 如果为null则new出唯一实例
            instance = new StorageBase()
        }
        return instance
    }
})()

const storage1 = Storage()
const storage2 = Storage()

storage1.setItem('name', 'Amadeus')

storage1.getItem('name')
storage2.getItem('name')

storage1 === storage2 ? console.log("指向同一个实例") : console.log("no one")